import logging
from flask import Flask
from routes import register_routes
from config import UPLOAD_FOLDER, PROCESSED_FOLDER

class HotwordLogFilter(logging.Filter):
    """过滤 FunASR 热词解析的冗余日志"""
    def filter(self, record):
        message = record.getMessage()
        # 过滤掉热词解析相关的日志
        if "Attempting to parse hotwords" in message:
            return False
        if "Hotword list:" in message:
            return False
        return True

def setup_logging():
    """配置日志"""
    # 确保日志目录存在
    import os
    if not os.path.exists('logs'):
        os.makedirs('logs')
    
    # 创建格式化器
    formatter = logging.Formatter(
        '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S'
    )
    
    # 创建控制台处理器
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.DEBUG)
    console_handler.setFormatter(formatter)
    
    # 创建文件处理器
    file_handler = logging.FileHandler('logs/upload_service.log', encoding='utf-8')
    file_handler.setLevel(logging.DEBUG)
    file_handler.setFormatter(formatter)
    
    # 配置根日志器
    root_logger = logging.getLogger()
    root_logger.setLevel(logging.DEBUG)
    root_logger.handlers.clear()  # 清除现有处理器
    root_logger.addHandler(console_handler)
    root_logger.addHandler(file_handler)
    
    # 添加热词日志过滤器到根日志器
    hotword_filter = HotwordLogFilter()
    root_logger.addFilter(hotword_filter)
    
    # 确保所有子模块的日志都能输出到控制台
    for logger_name in ['flask.app', 'async_processor', 'audio_processor', 'database', 'minio_manager', 'spk_emotion', 'llm_manager']:
        logger = logging.getLogger(logger_name)
        logger.setLevel(logging.DEBUG)
        logger.propagate = True  # 确保日志传播到父级
    
    # 降低第三方库的日志级别，避免冗余日志（特别是 FunASR 的热词解析日志）
    # FunASR 使用 root logger 输出大量热词解析信息，这里将其级别提升到 WARNING
    logging.getLogger('funasr').setLevel(logging.WARNING)
    logging.getLogger('modelscope').setLevel(logging.WARNING)
    # 对于直接使用 root logger 的库，通过设置更高级别来过滤
    # 注意：这不会影响我们自己的日志，因为我们使用的是命名 logger
    
    print("日志配置完成 - 控制台和文件同步输出")

def create_app():
    """创建并配置Flask应用"""
    app = Flask(__name__)
    
    # 注册路由
    register_routes(app)
    
    return app

if __name__ == '__main__':
    setup_logging()
    logger = logging.getLogger(__name__)
    logger.info("启动文件上传服务...")
    
    app = create_app()
    app.run(host='0.0.0.0', port=5000, debug=False)  # 生产环境应关闭debug模式
